27520ed60238b4bf372f08ac40361c8d4569e474,src/org/openstreetmap/josm/data/osm/DataSetMerger.java,DataSetMerger,mergeById,#OsmPrimitive#,232
Before Change
break;
}
}
} else if (target.isDeleted() != source.isDeleted()) {
// differences in deleted state have to be resolved manually. This can
// happen if one layer is merged onto another layer
//
After Change
* @param source the source primitive which is to be merged into a target primitive
* @return true, if this method was able to merge <code>source</code> into a target object; false, otherwise
*/
private boolean mergeById(OsmPrimitive source) {
OsmPrimitive target = targetDataSet.getPrimitiveById(source.getId(), source.getType());
// merge other into an existing primitive with the same id, if possible
//
if (target == null)
return false;
// found a corresponding target, remember it
mergedMap.put(source.getPrimitiveId(), target.getPrimitiveId());
if (target.getVersion() > source.getVersion())
// target.version > source.version => keep target version
return true;
if (target.isIncomplete() && !source.isIncomplete()) {
// target is incomplete, source completes it
// => merge source into target
//
target.mergeFrom(source);
objectsWithChildrenToMerge.add(source.getPrimitiveId());
} else if (!target.isIncomplete() && source.isIncomplete()) {
// target is complete and source is incomplete
// => keep target, it has more information already
//
} else if (target.isIncomplete() && source.isIncomplete()) {
// target and source are incomplete. Doesn't matter which one to
// take. We take target.
//
} else if (target.isVisible() != source.isVisible() && target.getVersion() == source.getVersion())
// Same version, but different "visible" attribute. It indicates a serious problem in datasets.
// For example, datasets can be fetched from different OSM servers or badly hand-modified.
// We shouldn't merge that datasets.
throw new DataIntegrityProblemException(tr("Conflict in 'visible' attribute for object of type {0} with id {1}",
target.getType(), target.getId()));
else if (target.isDeleted() && ! source.isDeleted() && target.getVersion() == source.getVersion()) {
// same version, but target is deleted. Assume target takes precedence
// otherwise too many conflicts when refreshing from the server
// but, if source has a referrer that is not in the target dataset there is a conflict
// If target dataset refers to the deleted primitive, conflict will be added in fixReferences method
for (OsmPrimitive referrer: source.getReferrers()) {
if (targetDataSet.getPrimitiveById(referrer.getPrimitiveId()) == null) {
conflicts.add(new Conflict<OsmPrimitive>(target, source, true));
target.setDeleted(false);
break;
}
}
} else if (! target.isModified() && source.isDeleted()) {
// target not modified. We can assume that source is the most recent version,
// so mark it to be deleted.
//
objectsToDelete.add(target);
} else if (! target.isModified() && source.isModified()) {
// target not modified. We can assume that source is the most recent version.
// clone it into target.
target.mergeFrom(source);
objectsWithChildrenToMerge.add(source.getPrimitiveId());
} else if (! target.isModified() && !source.isModified() && target.getVersion() == source.getVersion()) {
// both not modified. Merge nevertheless.
// This helps when updating "empty" relations, see #4295
target.mergeFrom(source);
objectsWithChildrenToMerge.add(source.getPrimitiveId());
} else if (! target.isModified() && !source.isModified() && target.getVersion() < source.getVersion()) {
// my not modified but other is newer. clone other onto mine.
//
target.mergeFrom(source);
objectsWithChildrenToMerge.add(source.getPrimitiveId());
} else if (target.isModified() && ! source.isModified() && target.getVersion() == source.getVersion()) {
// target is same as source but target is modified
// => keep target and reset modified flag if target and source are semantically equal
if (target.hasEqualSemanticAttributes(source)) {
target.setModified(false);
}
} else if (source.isDeleted() != target.isDeleted()) {
// target is modified and deleted state differs.
// this have to be resolved manually.
//